package com.tensquare.notice.listener;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.rabbitmq.client.Channel;
import com.tensquare.entity.Result;
import com.tensquare.entity.StatusCode;
import com.tensquare.notice.netty.MyWebSocketHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;

import java.util.HashMap;
import java.util.Map;

/**
 * rabbitmq的监听器
 */
public class SysNoticeListener implements ChannelAwareMessageListener {

    private static final ObjectMapper objMapper = new ObjectMapper();

    /**
     * rabbitmq队列中有消息时就会触发这个方法
     * 只要不报错，这个方法调用后 队列中的消息会被清除
     * RabbitMQ触发的时机，只要有一个消息就会触发，一个一个来，每次只处理一个消息
     * 只能一次消费一个消息
     * //@RabbitHandler
     * @param message  队列中的消息
     * @param channel  连接通道
     * @throws Exception
     */
    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        //1. 先获取队列名称（userId）article_subscribe_2
        String queueName = message.getMessageProperties().getConsumerQueue();
        //2. 获取userId
        String userId = queueName.substring(queueName.lastIndexOf("_") + 1);
        //3. 通过userId取出channel（MyWebSocketHandler.channelMap）
        //   获取原来用户登陆时使用的连接通道channelMap<UserId,channel>
        io.netty.channel.Channel webSocketChannel = MyWebSocketHandler.channelMap.get(userId);
        //4. 构建WebSocket消息对象
        // 构建返回给浏览器的数据{data:{sysNoticeCount:1}}
        Map<String, Integer> resultMap = new HashMap<String,Integer>();
        resultMap.put("sysNoticeCount", 1);
        Result result = new Result(true, StatusCode.OK,"查询成功", resultMap);
        TextWebSocketFrame webSocketMsg = new TextWebSocketFrame(objMapper.writeValueAsString(result));
        //5. 往用户通道写消息（服务端主动推送信息给客户端）
        webSocketChannel.writeAndFlush(webSocketMsg);
    }
}
